#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e5+50;
ll Max=-1e9;
int n,u,v,ans,a[N];
struct Edge{
    int v,next;
}edge[N*2];
int cnt,head[N];
void init(){
    cnt=0;
    memset(head,-1,sizeof(head));
}
void addEdge(int u,int v){
    edge[cnt]=Edge{v,head[u]};
    head[u]=cnt++;
    edge[cnt]=Edge{u,head[v]};
    head[v]=cnt++;
}
ll dfs(int u,int f,bool flag){
    ll sum=a[u];
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        if(v==f){
            continue;
        }
        sum+=max(0ll,dfs(v,u,flag));
    }
    //回溯
    if(!flag){
        Max=max(Max,sum);
    }else if(sum==Max){
        //同样权值大小的连通块
        ans++;
        //置为0 不会返回给上一个节点
        sum=0;
    }
    return sum;
}
int main(void){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    init();
    for(int i=0;i<n-1;i++){
        scanf("%d%d",&u,&v);
        addEdge(u,v);
    }
    //dfs两遍 第一遍找最大的连通块权值 第二遍找相同权值连通块个数
    dfs(1,0,false);
    dfs(1,0,true);
    printf("%lld %d\n",ans*Max,ans);
    return 0;
}